package com.sure.minion.services.base.dao;

import java.io.Serializable;
import java.util.List;

import com.sure.minion.services.base.vo.BaseQuery;
import com.sure.minion.services.base.vo.PagedResult;


/**
 * @Description 基础DAO接口
 * @author syuan
 * @date 2015年8月28日  下午1:42:46
 * Company: TravelSky
 */
public interface IBaseDao {
	
	/**
	 * @Description 新增实体
	 * @param obj
	 * @date 2015年2月7日  下午10:00:33
	 */
	void save(Object obj);
	
	/**
	 * @Description 更新实体
	 * @param obj
	 * @date 2015年2月7日  下午10:01:12
	 */
	void update(Object obj);

	/**
	 * @Description 更新操作-SQL
	 * @param sql SQL语句
	 * @return
	 * @date 2015年2月7日  下午10:01:28
	 */
	int updateBySql(final String sql);
	
	/**
	 * @Description 更新操作-SQL
	 * @param sql SQL语句
	 * @param values SQL参数
	 * @return
	 * @date 2015年2月7日  下午10:01:59
	 */
	int updateBySql(final String sql, final Object... values);
	
	/**
	 * @Description 删除实体
	 * @param obj
	 * @date 2015年2月7日  下午10:02:45
	 */
	void delete(Object obj);
	
	/**
	 * @Description 删除实体-根据ID
	 * @param entityClass 实体类型
	 * @param id 实体ID
	 * @date 2015年2月7日  下午10:02:59
	 */
	<T> void delete(Class<T> entityClass, Serializable id); 
	
	/**
	 * @Description 查询实体-根据ID
	 * @param entityClass 实体类型
	 * @param id 实体ID
	 * @return 实体
	 * @date 2015年2月7日  下午10:04:33
	 */
	<T> T queryById(Class<T> entityClass, Serializable id);
	
	/**
	 * @Description 查询实体-JPQL
	 * @param jpql 
	 * @return 实体List
	 * @date 2015年2月7日  下午10:06:06
	 */
	@SuppressWarnings("rawtypes")
	List queryByJPQL(String jpql);
	
	/**
	 * @Description 查询-SQL
	 * @param sql 
	 * @return 
	 * @date 2015年2月7日  下午10:07:03
	 */
	@SuppressWarnings("rawtypes")
	List queryBySQL(String sql);
	
	/**
	 * @Description 查询-SQL
	 * @param sql
	 * @param values 参数
	 * @return
	 * @date 2015年2月7日  下午10:07:29
	 */
	@SuppressWarnings("rawtypes")
	List queryBySQL(final String sql, final Object... values);
	
    /**
     * @Description 执行SQL
     * @param sql
     * @param values 参数
     * @date 2015年2月7日  下午10:07:57
     */
    void execBySQL(final String sql, final Object... values);
    
	/**
	 * @Description 查询所有
	 * @param entityClass 实体类型
	 * @return
	 * @date 2015年2月7日  下午10:08:20
	 */
	<T> List<T> queryAll(Class<T> entityClass);
	
	/**
	 * @Description 查询记录数
	 * @param entityClass 实体类型
	 * @return
	 * @date 2015年2月7日  下午10:08:40
	 */
	<T> int queryRowCount(Class<T> entityClass);
	
    /**
     * @Description 查询-JPQL
     * @param queryString JPQL
     * @param values 参数
     * @return 
     * @date 2015年2月7日  下午10:09:42
     */
    @SuppressWarnings("rawtypes")
	List queryByJPQL(final String queryString, final Object... values);
    
    /**
     * 
     * @Description 查询-JPQL
     * @param queryString
     * @param entityClass
     * @param values
     * @return
     * @author yangwu
     * @date 2015-4-7  下午8:10:35
     */
    public <T> List<T> queryByJPQL(final String queryString,
			Class<T> entityClass, final Object... values);
    
    /**
     * @Description 分页查询-JPQL
     * @param queryString JPQL
     * @param rowStartIdx 记录开始位置
     * @param rowCount 记录数
     * @param values 参数
     * @return
     * @date 2015年2月7日  下午10:10:30
     */
    @SuppressWarnings("rawtypes")
	List queryPagedByJPQL(final String queryString, final int rowStartIdx, final int rowCount, final Object... values);
        
    /**
     * @Description 查询-返回第一个符合条件对象
     * @param entityClass 实体类型
     * @param queryString JPQL
     * @param values 参数
     * @return
     * @date 2015年2月7日  下午10:11:38
     */
    <T> T queryFirst(Class<T> entityClass, final String queryString, final Object... values);
    
    /**
     * @Description 查询-自定义查询条件
     * @param baseQuery 自定义查询对象
     * @return
     * @date 2015年2月7日  下午10:12:22
     */
    <T> List<T> queryForResult(BaseQuery baseQuery);
    
    /**
     * @Description 分页查询-自定义查询条件
     * @param baseQuery 自定义查询对象
     * @return 数据分页对象
     * @date 2015年2月7日  下午10:13:07
     */
    <T> PagedResult<T> queryForPagedResult(BaseQuery baseQuery);
    
    /**
     * @Description 分页SQL查询
     * @param sql SQL语句
     * @param rowStartIdx 记录开始位置
     * @param rowCount 记录条数
     * @param values 参数
     * @return
     * @date 2015年2月7日  下午10:33:07
     */
    @SuppressWarnings("rawtypes")
	List queryPageBySQL(final String sql, final int rowStartIdx, final int rowCount, final Object... values);
    
    /**
     * @Description 分页SQL查询
     * @param sql SQL语句
     * @param rowStartIdx 记录开始位置
     * @param rowCount 记录条数
     * @return
     * @date 2015年2月7日  下午10:35:12
     */
    @SuppressWarnings("rawtypes")
	List queryPageBySQL(final String sql, final int rowStartIdx, final int rowCount);
    
    /**
     * @Description 参数查询记录数
     * @param queryString JPQL
     * @param values 参数
     * @return
     * @date 2015年2月7日  下午10:37:45
     */
    int queryCountByJPQL(final String queryString, final Object... values);
    
	/**
	 * @Description 批量新增实体
	 * @author wangdm
	 * @param <T>
	 * @date 2015年2月28日  下午2:58:02
	 */
	<T> void batchSave(List<T> objList, Integer batchSize);
	
	/**
	 * @Description 批量新增或更新实体
	 * @author wangdm
	 * @param <T>
	 * @date 2015年2月28日  下午2:58:10
	 */
	<T> void batchSaveOrUpdate(List<T> objList, Integer batchSize);
	
	/**
	 * @Description 批量删除实体 
	 * @author wangdm
	 * @param <T>
	 * @date 2015年2月28日  下午2:58:20
	 */
	<T> void batchDelete(List<T> objList, Integer batchSize);
}
